package run.microservice.stock.serializer;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

/**
 * 字典自定义序列化
 * @author lunfangyu
 */
@Slf4j
public class DictSerializer extends JsonSerializer<Object> {

    private final String DICT_TEXT_SUFFIX = "Text";

    private String dictCode;

    public DictSerializer() {}

    public DictSerializer(String dictCode) {
        this.dictCode = dictCode;
    }

    /**
     * 处理字典序列化
     * 获取键值对，这里我处理成map的方式返回给前端
     * 这部分要自己处理，我这里是通过一个业务类从redis中获取字典
     * @param value 字段值
     * @param jsonGenerator
     * @param serializerProvider
     * @throws IOException
     *
     *  使用 JsonGenerator 对象生成Json格式的内容的
     *         generator.writeStartObject();                      // {
     *         generator.writeStringField("id", "1");             //    "id" : "1",
     *         generator.writeStringField("name", "亚瑟");         //    "name" : "亚瑟",
     *         generator.writeNumberField("age", 33);             //    "age" : 33,
     *         generator.writeFieldName("courseScores");          //    "courseScores" :
     *         generator.writeStartArray();                       //    [
     *         generator.writeStartObject();                      //      {
     *         generator.writeStringField("course", "Java");      //          "course" : "Java",
     *         generator.writeNumberField("score", 80);           //          "score" : 80
     *         generator.writeEndObject();                        //      },
     *         generator.writeStartObject();                      //      {
     *         generator.writeStringField("course", "C#");        //          "course" : "C#",
     *         generator.writeNumberField("score", 88);           //          "score" : 88
     *         generator.writeEndObject();                        //      }
     *         generator.writeEndArray();                         //    ]
     *         generator.writeEndObject();                        // }
     *
     */
    @Override
    public void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) {
        try {
            // 注解字段写入值
            jsonGenerator.writeObject(value);

            // 获取当前字段名
            String dictKeyField = jsonGenerator.getOutputContext().getCurrentName();
            log.debug("字典编码：{}；字典值：{}", dictCode, value);
            log.debug("@Dict注解字段：{}", dictKeyField);

            String dictText = "字典描述";
            // TODO 根据字典编码和字典值获取字典描述
            // dictText = getDictText(dictCode, value);

            // 追加字段
            String dictTextField = dictKeyField.concat(DICT_TEXT_SUFFIX);
            jsonGenerator.writeStringField(dictTextField, dictText);

        } catch (IOException e) {
            log.error("字典序列化失败：", e);
        }
    }

}
